package synchronize.synchronize002;

/**
 * 对象锁测试类
 */
public class MultiThread {
    private static int num = 0;

    /**
     * 如果此方法为静态方法，表示锁定了整个类，不管被几个对象调用，都要依次排获取对象的锁。
     * @param tag
     */
    public static synchronized void pringNum(String tag) {
        try {
            if (tag.equals("a")) {
                num = 100;
                System.out.println("tag a, set num over!");
                Thread.sleep(1000);
            } else {
                num = 200;
                System.out.println("tag b,set num over!");
            }
            System.out.println("tag" + tag + ",num=" + num);
        } catch (InterruptedException exp) {
            exp.printStackTrace();
        }
    }

    /**
     * 关键字synchronized取得的锁都是对象锁，而不是把一段代码（方法）当做锁，
     * 所以以代码中哪个线程先执行synchronized关键字的方法，哪个线程就持有该方法所属对象的锁（Lock）
     * <p>
     * 在静态方法上加synchronized关键字，表示锁定.class类，类一级别的锁（独占.class类）。
     *
     * @param args
     */
    public static void main(String[] args) {
        //多线程对象1
        final MultiThread m1 = new MultiThread();
        //多线程对象2
        final MultiThread m2 = new MultiThread();

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                m1.pringNum("a");
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                m2.pringNum("b");
            }
        });
        t1.start();
        t2.start();
    }

}
